package lambda;

import entity.Employee;
import org.junit.Test;

import java.io.PrintStream;
import java.util.Comparator;
import java.util.function.BiPredicate;
import java.util.function.Consumer;
import java.util.function.Supplier;
/**
 * Create with IDEA
 * author:yangyangkun
 * Date:2019/4/11
 * Time:9:14
 */
/**
 * 注意1：实现的接口 的 返回值与参数列表  和  要调用的方法 的 返回值和参数列表 一致
 * */
public class 方法引用 {
    //（1） 对象名::实例方法名
    @Test
    public void test1(){
        PrintStream ps1 = System.out;
        Consumer<String> con = (x) -> ps1.println(x);
        //用方法引用实现
        PrintStream ps2 = System.out;
        Consumer<String> con1 = ps2::println;
        con1.accept("这是用方法引用实现的打印");
    }
    @Test
    public void test2(){
        Employee employee = new Employee("小明");
        Supplier<String> sup1 = () -> employee.getName();
        String name = sup1.get();
        System.out.println(name);
        //使用方法引用
        Supplier<String> sup2 = employee::getName;
        String name1 = sup1.get();
        System.out.println("这是方法引用打印的名字："+name1);
    }
    //（2） 类::静态方法名
    @Test
    public void test3(){
        Comparator<Integer> com1 = (x,y) -> Integer.compare(x,y);
        Comparator<Integer> com2 = Integer::compare;
        System.out.println(com1.compare(10,9));
        System.out.println(com2.compare(7,9));
    }
    //（1） 类::实例方法名
    //注意：本来该通过String的对象的实例来调用equals，但是如果
    // 方法体的第一个参数是方法的调用者，第二个参数是实例方法的参数，则可以 使用  这种调用方式
    //需求：比较两个字符串是否一致
    @Test
    public void test4(){
        //用Lambda表达式
        BiPredicate<String,String> bp1 = (x,y) -> x.equals(y);
        BiPredicate<String,String> bp2 = String::equals;
        System.out.println(bp1.test("ok","ok"));
        System.out.println(bp2.test("no","no"));
    }
}
